package com.manning.readinglist;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Component
public class ApplicationContextMetrics implements PublicMetrics {
    private ApplicationContext context;

    @Autowired
    public ApplicationContextMetrics(ApplicationContext context) {
        this.context = context;
    }

    /**
     * Actuator 会调用 metrics() 方法，收集 ApplicationContextMetrics 提供的度量信息。该方法调用了所注入的 ApplicationContext 上的方法，获取我们想要报告为度量的数量。
     * 每个度量值都会创建一个 Metrics 实例，指定度量的名称和值，将其加入要返回的列表。
     * @return
     */
    @Override
    public Collection<Metric<?>> metrics() {
        List<Metric<?>> metrics = new ArrayList<>();
        // 记录启动时间
        metrics.add(new Metric<Long>("spring.context.startup-date", context.getStartupDate()));

        // 记录 Bean 定义数量
        metrics.add(new Metric<Integer>("spring.beans.definitions", context.getBeanDefinitionCount()));

        // 记录 Bean 数量
        metrics.add(new Metric<Integer>("spring.beans", context.getBeanNamesForType(Object.class).length));

        // 记录控制器类型的 Bean 数量
        metrics.add(new Metric<Integer>("spring.controllers", context.getBeanNamesForAnnotation(Controller.class).length));

        return metrics;
    }
}
